package com.itbaizhan.topic;

import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/*通配符模式
* 生产者*/
public class Producer {
    public static void main(String[] args) throws IOException, TimeoutException {
        ConnectionFactory connectionFactory = new ConnectionFactory();
        connectionFactory.setHost("192.168.66.101");
        connectionFactory.setPort(5672);
        connectionFactory.setUsername("itbaizhan");
        connectionFactory.setPassword("itbaizhan");
        connectionFactory.setVirtualHost("/"); //设置虚拟机，默认是 /

        Connection connection = connectionFactory.newConnection();

        Channel channel = connection.createChannel();
        //创建交换机  declare :声明; 宣布; 宣告; 宣称
        /*
         * 参数1：交换机名
         * 参数2：交换机类型
         * 参数3：交换机持久化*/
        channel.exchangeDeclare("exchange_topic", BuiltinExchangeType.TOPIC,true);
        //创建队列
        /*
         *参数1：队列名
         * 参数2：是否持久化，true表示MQ重启后队列还在
         * 参数3：是否私有化，false表示所有消费者都可以访问  true表示只有第一次拥有它的消费者才可以访问
         * 参数4： 是否自动删除，true表示不再使用队列时自动删除队列
         * 参数5：其他的额外参数
         * */
        channel.queueDeclare("SEND_MAIL3",true,false,false,null);
        channel.queueDeclare("SEND_MESSAGE3",true,false,false,null);
        channel.queueDeclare("SEND_STATION3",true,false,false,null);
        //绑定交换机
        channel.queueBind("SEND_MAIL3","exchange_topic","#.mail.#");
        channel.queueBind("SEND_MESSAGE3","exchange_topic","#.message.#");
        channel.queueBind("SEND_STATION3","exchange_topic","#.station.#");


        //发送信息  路由键中有关键字就可以
        channel.basicPublish("exchange_topic","mail.message.station",null,"双十一大促活动".getBytes());
        channel.basicPublish("exchange_topic","station",null,"小小的促销活动".getBytes());
        channel.close();
        connection.close();
    }
}
/*
通配符模式(Topic)是在路由模式的基础上，给队列绑定带通配符的路由关键字，只要
消息的RoutingKey能实现通配符匹配，就会将消息转发到该队列。通配符模式比路由
模式更灵活，使用topic交换机。

通配符规则：

消息设置RoutingKey时，RoutingKey由多个单词构成，中间以.分割。
队列设置RoutingKey时，#可以匹配任意多个单词，*可以匹配任意一个单词。*/